import os
import uuid
from io import BytesIO

import pandas as pd
from flask import Flask, render_template, request, jsonify, send_file

app = Flask(__name__)

#首页
@app.route('/')
def index():
    ###Jinja2模板引擎
    return render_template('index.html')
#上传文件，比对
@app.route('/fileUploadLocal', methods=['POST'])
def fileUploadLocal():
    # 生成一个UUID
    unique_id = uuid.uuid4()
    # 将UUID对象转换为字符串
    uuid_str = str(unique_id)
    #获取请求文件
    file1 = request.files.get('file1')
    file2 = request.files.get('file2')
    # 检查文件是否存在
    if file2 is None:
        return '{"resultMsg":"文件2为空，上传失败!"}'
    if file1 is None:
        return '{"resultMsg":"文件1为空，上传失败!"}'

    #请求参数转set
    reqParamList = request.form.getlist('name')
    params=set(reqParamList)
    # 移除None
    params.discard(None)
    # 移除空字符串
    params.discard('')
    if len(params) == 0:
        return '{"resultMsg":"请求参数不能为空"}'


    try:
        # 使用pandas读取CSV文件内容
        dataFrame1 = pd.read_excel(file1)
        dataFrame2 = pd.read_excel(file2)
        # 获取两个DataFrame的列名集合
        columns_set1 = set(dataFrame1.columns)
        columns_set2 = set(dataFrame2.columns)
        # 找出两个集合中相同的列名
        common_columns = columns_set1.intersection(columns_set2)
        # 如果想要找出所有不相同的列（不管在哪个文件中），可以使用symmetric_difference
        all_different_columns = columns_set1.symmetric_difference(columns_set2)
        # 输入参数校验，输入参数是否在excel1和excel2都存在
        for param in params:
            paramsIsExsitscommon_columns = False
            for common_column in common_columns:
                if param==common_column:
                    paramsIsExsitscommon_columns=True
            if paramsIsExsitscommon_columns:
                print("参数匹配")
            else:
                return '{"resultMsg":"请求参数不匹配'+param+'在excel1和excel2都不存在"}'

        ###相同字段，合并时起别名
        _excel1 = '_excel1'
        _excel2 = '_excel2'
        #outerJoinKey是关联条件，pandas的比对条件
        outerJoinKey =list(params)
        ####全链接 how='outer' ;初步的比对结果
        mergeDataFrame = pd.merge(dataFrame1, dataFrame2, on=outerJoinKey, how='outer', suffixes=(_excel1, _excel2),
                                  indicator='关联结果')
        #########################################数据加工处理(找出相同列，不同列,并按excel1,excel2,compare。。。输出结果)###########################################################


        #########################################相同的列名，比对下结果,并添加到DataFrame 开始######################################################
        # 过滤掉关联条件
        for join_key in outerJoinKey:
            common_columns.remove(join_key)
        for common_headName in common_columns:
            # 比对结果
            comparison_result = mergeDataFrame[common_headName + _excel1] == mergeDataFrame[common_headName + _excel2]
            # 添加一个列，存放比较结果
            mergeDataFrame[common_headName + '-比对结果'] = comparison_result
        #########################################相同的列名，比对下结果,并添加到DataFrame 结束######################################################

        ###自定义输出结果字段ouput_columns_list，例如['姓名', '部门', '电话_excel1', '电话_excel2', '电话-比对结果']，为了结果好看
        ouput_columns_list = []
        #先把关联条件放到前面几列
        for outerJoinKeyTmp in outerJoinKey:
            ouput_columns_list.append(outerJoinKeyTmp)
        ouput_columns_list.append('关联结果')
        #公共字段，分别excel1,excel2,比对结果
        for common_headName in common_columns:
            ouput_columns_list.append(common_headName + _excel1)
            ouput_columns_list.append(common_headName + _excel2)
            ouput_columns_list.append(common_headName + '-比对结果')
        #差集字段，放后面展示
        for diff_headName in all_different_columns:
            ouput_columns_list.append(diff_headName)
        selected_columns_data = mergeDataFrame[ouput_columns_list]  # 选择你想要的列

        #写入到本地，下载后删除
        selected_columns_data.to_excel(uuid_str + "comareResult.xlsx")
        # 打印比较结果
        print(selected_columns_data)
    except pd.errors.EmptyDataError:
        return '{"resultMsg":"比对异常，请联系管理员"}'
    except Exception as e:
        return '{"resultMsg":"比对异常，请联系管理员"}'
    ###compareFileName 返回前端的文件下载key
    compareFileName=uuid_str + "comareResult.xlsx"
    return '{"resultMsg":"SUCCESS","downKey":"'+compareFileName+'"}'

@app.route('/downloadFile')
def downloadFile():
    downLoadKey = request.args.get('downLoadKey')
    print(downLoadKey)
    # 读取 Excel 文件
    df = pd.read_excel(downLoadKey)
    # 在内存中创建 Excel 文件
    excel_file = BytesIO()
    # 使用 pandas 将数据写入内存中的 Excel 文件
    with pd.ExcelWriter(excel_file, engine='openpyxl') as writer:
        df.to_excel(writer, index=False)
        # 将文件指针重置到文件开头
    excel_file.seek(0)
    # 发送文件给客户端
    if os.path.isfile(downLoadKey):
        # 删除文件
        os.remove(downLoadKey)
        print(f"文件 '{downLoadKey}' 已被删除。")
    else:
        print(f"文件 '{downLoadKey}' 不存在。")
    return send_file(excel_file, download_name='downloaded_file.xlsx', as_attachment=True)

if __name__ == '__main__':
    app.run(port=8080)
